iT邦幫忙

2024 iThome 鐵人賽

DAY 4
0
Security

你的程式真的安全嗎?從資安的角度做 code review系列 第 18

C - uncaught error (拒絕服務:未被捕獲的錯誤)

  • 分享至 

  • xImage
  •  

下方程式碼片段全部都是擷取自 Secure Code Warrior 線上安全程式培訓平台,因為練習互動時的題目多半不會只有單一個檔案,可能涉及多個檔案、資料夾及多處地方修改,因此我的文章主要是針對最主要的區塊做修改及說明,若有不好理解的地方非常抱歉也還請見諒,也可以實際上去 Secure Code Warrior 玩玩看,搭配著互動,會更有感的學習哦~

C - uncaught error (拒絕服務:未被捕獲的錯誤)

  • 形成原因:當開發時未設置錯誤處理檢查,攻擊者注入和觸發錯誤條件,錯誤未被捕獲,因而為系統造成了巨大的回應延遲、損失和服務中斷
  • 後果:整個應用程式崩潰、功能服務無法正常使用,降低正常使用者的服務品質;彈出的錯誤訊息可能洩漏敏感資訊
  • 實例:假設有個程式採用兩個數字引數,程式開發中沒有加入輸入驗證或錯誤處理,當使用者輸入兩個字串時,該程式會出錯,進而導致程式崩潰無法使用
  • 解決方法:開發時時加入錯誤處理機制

第1題

錯誤區塊

unsigned LocationObject::getWeaponQuantity(unsigned typeNumber) const
{
  return weaponCnt_.at(typeNumber);
}
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

解釋:
透過at方法存取容器元素時,不會檢查輸入值,這代表如果具有此類金鑰的元素不存在,例外情況將發生,這將導致程式崩潰。

主要修正方法

將原區塊改成

unsigned LocationObject::getWeaponQuantity(unsigned typeNumber) const
{
  auto it = weaponCnt_.find(typeNumber);
  // If typeNumber is found in the map, return its associated value. If not found, return 0.
  return (it == weaponCnt_.end()) ? 0 : it->second;
}
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

解釋:
建議檢查有效的輸入值,以避免未捕獲的錯誤情況。使用內建的查詢方法檢查輸入值,該方法消除了使用不存在的金鑰對容器元素的存取。

第2題

錯誤區塊

size_t el = 0;
while (1)
{
    this->addTrack(tempSituation[el]);
    ++el;
    if (el >= tempSituation.size())
      break;
}
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

解釋:
如果tempSituation 陣列中某一個引數位的值不包含物件,則將存取不存在的物件。但由於現有檢查沒有檢測到此錯誤,程式可能會崩潰。

主要修正方法

把原區塊改成

for(const auto & el: tempSituation)
{
    this->addTrack(el);
    if (tracks_.max_size() == tracks_.size()) break;
}

解釋:
建議檢查變數是否有意外值。該應用程式包括一個基於範圍的迴圈,用於在現有物件上進行遍及一個額外的檢查,以確保從檔案中載入正確數量的引數。


上一篇
C - insecure direct object reference(存取控制:不安全的直接物件引用)
下一篇
C - REGEX DoS (拒絕服務:規則表達式 DoS)
系列文
你的程式真的安全嗎?從資安的角度做 code review25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言